﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using GS1.Negocio;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GS1.Entidad;
using System.Diagnostics;
using log4net;
using System.Configuration;
using GS1.Utilitario;
// Reference the API
using ThingMagic;

namespace Demo.Formularios
{
    public partial class frmModificar : Form
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(frmNuevo));
        

        #region --- Variables y Propiedades ---
        private const string TITULO = "CONFIRMACIÓN";
        private  RFIDState estadoReader;
        private enum RFIDState
        {
            CONECTADO,
            DESCONECTADO
        }

        Uri objUri;
        Reader reader;

        private Etiqueta etiqueta = null;
        private Etiqueta nueva = null;
        private Etiqueta etiquetaObtenido = null;
        private string nvehiculo = null;
        private string epc = null;
        private Vehiculo vehiculo = null;
        #endregion

        #region --- Constructor ---
        public frmModificar()
        {
            InitializeComponent();
        }
        #endregion
        
        #region --- Eventos del Reader ---  

        #endregion 

        #region --- Eventos Formulario ---
     
        private void frmModificar_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void frmModificar_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.estadoReader == RFIDState.CONECTADO) { CambiarEstadoReader(); }
        }

        private void btnLeer_Click(object sender, EventArgs e)
        {
            leerEtiqueta();
        }
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            grabarEpc();
        }
        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }      
        #endregion


        #region --- Metodos Propios ---

        private void cargarFormulario()
        {
            try
            {
                this.estadoReader = RFIDState.DESCONECTADO;
                //Obteniendo datos de terminal/usuario/bd Actual
                this.lblFechaMod.Text = Convert.ToString(DateTime.Now.Date);
                this.lblTerminalMod.Text = Constantes.NOMBRE_COMPUTADORA;
                this.lblPerfilMod.Text = Constantes.BD_CONEXION + "-" + Constantes.PERFIL_USUARIO + "-" + Constantes.CODIGO_USUARIO;
                this.lblOficinaMod.Text = Constantes.NOMBRE_EMPRESA + "-" + Constantes.NOMBRE_OFICINA;
                this.cbIndicadorEdit.Items.Add(Constantes.ESTADO_DESCRIPCION_ACTIVO);
                this.cbIndicadorEdit.Items.Add(Constantes.ESTADO_DESCRIPCION_INACTIVO);


            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, this.Text);
            }
        }

        private void CambiarEstadoReader()
        {
            //AGREGAR CONEXIÓN CON READER Y cambiar de estado

            this.estadoReader = RFIDState.CONECTADO;
        }

        private void generarEpc()
        {
            this.epc = "340833B2DDD9";

            string nvehiculo = this.txtVehiculo.Text;

            for (int i = 0; i < nvehiculo.Length; i++)
            {
                switch (nvehiculo.Substring(i, 1))
                {
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_GUION_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_GUION_HEXA;
                            break;
                        }

                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_PUNTO_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_PUNTO_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_A_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_A_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_B_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_B_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_C_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_C_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_D_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_D_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_E_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_E_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_F_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_F_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_G_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_G_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_H_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_H_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_I_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_I_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_J_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_J_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_K_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_K_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_L_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_L_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_M_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_M_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_N_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_N_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_O_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_O_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_P_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_P_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Q_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Q_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_R_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_R_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_S_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_S_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_T_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_T_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_U_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_U_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_V_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_V_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_W_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_W_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_X_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_X_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Y_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Y_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Z_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_Z_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_0_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_0_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_1_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_1_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_2_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_2_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_3_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_3_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_4_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_4_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_5_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_5_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_6_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_6_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_7_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_7_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_8_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_8_HEXA;
                            break;
                        }
                    case Constantes.ASCII_MANTENIMIENTO_ETIQUETA_9_DES:
                        {
                            this.epc = this.epc + Constantes.ASCII_MANTENIMIENTO_ETIQUETA_9_HEXA;
                            break;
                        }

                }

            }

        }

       
        private void leerEtiqueta()
        {
            //Proceso para leer EPC etiqueta
            //ObtenerEtiquetaReader();

            //Obtener información de etiqueta desde la BD
            if (this.epc != null)
            {
                if (obtenerEtiqueta())
                {
                    //Mostrar información en pantalla
                    this.txtEPC.Text = this.etiquetaObtenido.codEpc;
                    this.txtVehiculo.Text = this.etiquetaObtenido.codvehiculo;
                    if (this.etiquetaObtenido.indicador == Convert.ToInt32(Constantes.ESTADO_CODIGO_ACTIVO))
                    {
                        this.cbIndicadorEdit.Items.Add(Constantes.ESTADO_DESCRIPCION_ACTIVO);
                    }
                    else
                    {
                        this.cbIndicadorEdit.Items.Add(Constantes.ESTADO_DESCRIPCION_INACTIVO);
                    }

                }
                else
                {
                    MessageBox.Show("Etiqueta no registrada", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            }
            else
            {
                MessageBox.Show("Etiqueta vacía", "ALERTA", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
        }
        private bool obtenerEtiqueta()
        {
            Etiqueta etiqueta = null;
            this.etiquetaObtenido = null;
            try
            {
                etiqueta = new Etiqueta();
                etiqueta.codEpc = this.epc;
                etiquetaObtenido = new EtiquetaBL().obtenerEtiqueta(etiqueta);
            }

            catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }

            return this.etiquetaObtenido == null;
        }


        private void grabarEpc()
        {
            if (this.cbIndicadorEdit.SelectedItem.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.cbIndicadorEdit, "Debe seleccionar estado", TITULO);
                return;
            }
            if (MessageBox.Show("¿Estas seguro de grabar etiqueta?", "ALERTA", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)

                // Si el número de vehículo escrito en el texbox, es igual al número de vehículo obtenido, cambio estado == modificar
                if (etiquetaObtenido.codvehiculo.Equals(this.txtVehiculo.Text))
                {
                    if (modificarEtiqueta())
                    {
                        MessageBox.Show("Se cambió de estado correctamente",TITULO,  MessageBoxButtons.OK, MessageBoxIcon.Information);

                        //Cargamos los datos en pantalla
                        this.txtEPC.Text = this.etiquetaObtenido.codEpc;
                        this.txtVehiculo.Text = this.etiquetaObtenido.codvehiculo;
                        if (this.etiquetaObtenido.indicador == Convert.ToInt32(Constantes.ESTADO_CODIGO_ACTIVO))
                        {
                            this.cbIndicadorEdit.Items.Add(Constantes.ESTADO_DESCRIPCION_ACTIVO);
                        }
                        else
                        {
                            this.cbIndicadorEdit.Items.Add(Constantes.ESTADO_DESCRIPCION_INACTIVO);
                        }
                    }
                }
                //Si no son iguales, regrabar
                else
                {
                    if (this.estadoReader == RFIDState.CONECTADO)
                    {
                        MessageBox.Show("Coloque la etiqueta encima del lector", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        generarEpc();

                        MessageBox.Show("Conexión con lector confirmada", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        //Se confirma que el código no este registrado previamente
                        if (!validaActivo())
                        {
                            MessageBox.Show("Esta etiqueta ya está asociada a un vehículo", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                            return;
                        }

                        if (MessageBox.Show("Proceso de grabación no retire la etiqueta", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                        {
                            //Regraba etiqueta con reader 
                            grabaEpc();
                        }
                        if (MessageBox.Show("Grabado. No retire etiqueta. Pulse aceptar para bloquear acceso", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                        {
                            //Bloquea Etiqueta
                            bloquearAcceso();
                        }
                        if (MessageBox.Show("Guardando. Pulse aceptar", "CONFIRMACIÓN", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.Yes)
                        {
                            //Graba código EPC-Vehículo en Base de Datos
                            if (guardarEpc())
                            {
                                MessageBox.Show("Proceso terminado", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            else
                            {
                                //Se detuvo la grabación por problemas en BD
                                MessageBox.Show("No se registro etiqueta", TITULO, MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                    }
                }
        }
        private void grabaEpc()
        {
        }
        private void bloquearAcceso()
        {
        }
        private bool validaActivo()
        {
            Etiqueta etiqueta = null;
            Etiqueta etiquetaObtenido = null;
         try
            {
            etiqueta = new Etiqueta();
            etiqueta.codEpc = this.epc;
            etiquetaObtenido = new EtiquetaBL().obtenerEtiqueta(etiqueta);
            }
            
         catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }

            return etiquetaObtenido == null;
        }

        private bool modificarEtiqueta()
        {
            Etiqueta etiqueta = null;
            bool respuesta = false;
            try
            {
                etiqueta = new Etiqueta();
                etiqueta.codEpc = this.epc;
                etiqueta.codvehiculo = this.vehiculo.codvehiculo;
                if (this.cbIndicadorEdit.SelectedText.Equals(Constantes.ESTADO_DESCRIPCION_ACTIVO))
                {
                    etiqueta.indicador = Convert.ToInt32(Constantes.ESTADO_CODIGO_ACTIVO);
                }
                else
                {
                    etiqueta.indicador = Convert.ToInt32(Constantes.ESTADO_CODIGO_INACTIVO);
                }
                etiqueta.nomCompModi = Convert.ToString(ConfigurationManager.AppSettings[Constantes.NOMBRE_COMPUTADORA].desEncriptarDES(ConfigurationManager.AppSettings[Constantes.LLAVE_3DS]).ToString());
                etiqueta.codUsuaMofi = ConfigurationManager.AppSettings[Constantes.CODIGO_USUARIO].desEncriptarDES(ConfigurationManager.AppSettings[Constantes.LLAVE_3DS]).ToString();
                etiqueta.fechaModificacion = DateTime.Now;

                respuesta = new EtiquetaBL().modificarEtiqueta(etiqueta);
            }
            catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }
            return respuesta;
        }

        private bool guardarEpc()
        {
            Etiqueta etiqueta = null;
            bool respuesta = false;
            try
            {
                etiqueta = new Etiqueta();
                etiqueta.codEpc = this.epc;
                etiqueta.codvehiculo = this.vehiculo.codvehiculo;
                if (this.cbIndicadorEdit.SelectedText.Equals(Constantes.ESTADO_DESCRIPCION_ACTIVO))
                {
                    etiqueta.indicador = Convert.ToInt32(Constantes.ESTADO_CODIGO_ACTIVO);
                }
                else
                {
                    etiqueta.indicador = Convert.ToInt32(Constantes.ESTADO_CODIGO_INACTIVO);
                }
                etiqueta.nomCompCrea = Convert.ToString(ConfigurationManager.AppSettings[Constantes.NOMBRE_COMPUTADORA].desEncriptarDES(ConfigurationManager.AppSettings[Constantes.LLAVE_3DS]).ToString());
                etiqueta.codUsuaCrea = ConfigurationManager.AppSettings[Constantes.CODIGO_USUARIO].desEncriptarDES(ConfigurationManager.AppSettings[Constantes.LLAVE_3DS]).ToString();
                etiqueta.fechaCreacion = DateTime.Now;

                respuesta = new EtiquetaBL().registrarEtiqueta(etiqueta);
            }
            catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }
            return respuesta;
        }

        private void salir()
        {
            this.Close();
        }

        
       /* private void button1_Click(object sender, EventArgs e)
        {
            Etiqueta etiqueta = new Etiqueta();
            etiqueta.codEpc = "340833B2DDD94C2D30313437";
            EtiquetaBL etiquetabl = new EtiquetaBL();

            etiquetabl.obtenerEtiqueta(etiqueta);
           
        }*/

    }
        #endregion
}
